package main

import (
	"fmt"
	"log"
	"os"
	"strings"

	"go-file-perception-model/internal/config"
	"go-file-perception-model/internal/logger"
	"go-file-perception-model/internal/service"
	"go-file-perception-model/pkg/embedding"
)

func main() {
	fmt.Println("=== 分块修复验证测试 ===")

	// 初始化日志系统
	logger.InitLogger()

	// 加载配置
	cfg, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}

	// 初始化嵌入模型
	bgeConfig := &embedding.BGEServiceConfig{
		Host:    cfg.BGEService.Host,
		Port:    cfg.BGEService.Port,
		APIKey:  cfg.BGEService.APIKey,
		Timeout: cfg.BGEService.Timeout,
	}
	embeddingModel, err := embedding.NewBGEModel(bgeConfig)
	if err != nil {
		log.Printf("Warning: Failed to initialize embedding model: %v", err)
		embeddingModel = nil
	}

	// 创建修复后的文件处理器
	fileProcessor := service.NewFileProcessor(embeddingModel, &cfg.FileIndex)

	// 测试文本 - 包含会被切断的长句子
	testText := `第一条 为了规范省国资委监管企业负责人薪酬管理，建立健全与劳动力市场基本适应、与企业经济效益和劳动生产率挂钩的工资决定和正常增长机制，根据《中华人民共和国公司法》《中华人民共和国企业国有资产法》等法律法规和有关政策规定，结合我省实际情况和发展需要，充分考虑市场化改革要求和国有企业特点，统筹兼顾各方面利益关系，制定本办法。第二条 本办法适用于省国资委履行出资人职责的国有独资企业、国有独资公司、国有控股企业（以下统称监管企业）负责人薪酬管理工作。第三条 监管企业负责人薪酬管理应当坚持市场化原则、激励约束并重原则、公开透明原则和可持续发展原则。`

	fmt.Printf("测试文本长度: %d 字符\n", len(testText))
	fmt.Printf("分块大小配置: %d 字符\n", cfg.FileIndex.ChunkSize)
	fmt.Printf("语义分块启用: %v\n", cfg.FileIndex.SemanticChunking)
	fmt.Println()

	// 使用修复后的FileProcessor处理文本
	// 注意：ProcessFile需要文件路径，我们这里创建一个临时文件
	tempFile := "temp_test.txt"
	err = writeToFile(tempFile, testText)
	if err != nil {
		log.Fatalf("Failed to create temp file: %v", err)
	}
	defer deleteFile(tempFile)

	// 处理文件
	chunks, err := fileProcessor.ProcessFile(tempFile)
	if err != nil {
		log.Fatalf("Failed to process file: %v", err)
	}

	fmt.Printf("生成了 %d 个分块:\n\n", len(chunks))

	// 分析每个分块的句子完整性
	brokenSentences := 0
	for i, chunk := range chunks {
		content := strings.TrimSpace(chunk.Content)
		
		// 检查是否以句子结束符结尾
		endsWithPunctuation := strings.HasSuffix(content, "。") || 
							   strings.HasSuffix(content, "！") || 
							   strings.HasSuffix(content, "？")
		
		// 检查是否在句子中间被切断
		isBroken := !endsWithPunctuation && i < len(chunks)-1
		
		if isBroken {
			brokenSentences++
		}
		
		fmt.Printf("分块 %d:\n", i+1)
		fmt.Printf("  长度: %d 字符\n", len(content))
		fmt.Printf("  分块序号: %d\n", chunk.ChunkNo)
		fmt.Printf("  起始位置: %d\n", chunk.StartPos)
		fmt.Printf("  结束位置: %d\n", chunk.EndPos)
		fmt.Printf("  起始行: %d\n", chunk.StartLine)
		fmt.Printf("  结束行: %d\n", chunk.EndLine)
		fmt.Printf("  完整句子结尾: %v\n", endsWithPunctuation)
		
		if isBroken {
			fmt.Printf("  ⚠️  警告: 句子被切断\n")
		}
		
		// 显示内容片段
		if len(content) > 100 {
			fmt.Printf("  开头: %s...\n", content[:50])
			fmt.Printf("  结尾: ...%s\n", content[len(content)-50:])
		} else {
			fmt.Printf("  内容: %s\n", content)
		}
		
		fmt.Println()
	}

	// 总结
	fmt.Println("=== 测试结果 ===")
	if brokenSentences == 0 {
		fmt.Println("✅ 所有句子边界都得到了保护！")
		fmt.Println("✅ 分块修复成功！")
	} else {
		fmt.Printf("❌ 仍有 %d 个分块包含被切断的句子\n", brokenSentences)
		fmt.Println("❌ 需要进一步修复")
	}
	
	fmt.Printf("总分块数: %d\n", len(chunks))
	fmt.Printf("平均分块长度: %.1f 字符\n", float64(len(testText))/float64(len(chunks)))
}

// writeToFile 写入临时文件
func writeToFile(filename, content string) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()
	
	_, err = file.WriteString(content)
	return err
}

// deleteFile 删除文件
func deleteFile(filename string) {
	os.Remove(filename)
}